home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / phpMyAdmin / libraries / tbl_move_copy.php < prev    next >
PHP Script  |  2005-04-01  |  18KB  |  375 lines

  1. <?php
  2. /* $Id: tbl_move_copy.php,v 1.4 2005/04/01 21:56:01 lem9 Exp $ */
  3. // vim: expandtab sw=4 ts=4 sts=4:
  4.  
  5. /**
  6.  * Inserts existing entries in a PMA_* table by reading a value from an old entry
  7.  *
  8.  * @param   string  The array index, which Relation feature to check
  9.  *                  ('relwork', 'commwork', ...)
  10.  * @param   string  The array index, which PMA-table to update
  11.  *                  ('bookmark', 'relation', ...)
  12.  * @param   array   Which fields will be SELECT'ed from the old entry
  13.  * @param   array   Which fields will be used for the WHERE query
  14.  *                  (array('FIELDNAME' => 'FIELDVALUE'))
  15.  * @param   array   Which fields will be used as new VALUES. These are the important
  16.  *                  keys which differ from the old entry.
  17.  *                  (array('FIELDNAME' => 'NEW FIELDVALUE'))
  18.  
  19.  * @global  string  relation variable
  20.  *
  21.  * @author          Garvin Hicking <me@supergarv.de>
  22.  */
  23. function PMA_duplicate_table_info($work, $pma_table, $get_fields, $where_fields, $new_fields) {
  24.     global $cfgRelation;
  25.  
  26.     $last_id = -1;
  27.  
  28.     if ($cfgRelation[$work]) {
  29.         $select_parts = array();
  30.         $row_fields = array();
  31.         foreach ($get_fields AS $nr => $get_field) {
  32.             $select_parts[] = PMA_backquote($get_field);
  33.             $row_fields[$get_field] = 'cc';
  34.         }
  35.  
  36.         $where_parts = array();
  37.         foreach ($where_fields AS $_where => $_value) {
  38.             $where_parts[] = PMA_backquote($_where) . ' = \'' . PMA_sqlAddslashes($_value) . '\'';
  39.         }
  40.  
  41.         $new_parts = array();
  42.         $new_value_parts = array();
  43.         foreach ($new_fields AS $_where => $_value) {
  44.             $new_parts[] = PMA_backquote($_where);
  45.             $new_value_parts[] = PMA_sqlAddslashes($_value);
  46.         }
  47.  
  48.         $table_copy_query = 'SELECT ' . implode(', ', $select_parts)
  49.                           . ' FROM ' . PMA_backquote($cfgRelation[$pma_table])
  50.                           . ' WHERE ' . implode(' AND ', $where_parts);
  51.         
  52.         // must use PMA_DBI_QUERY_STORE here, since we execute another
  53.         // query inside the loop
  54.         $table_copy_rs    = PMA_query_as_cu($table_copy_query, TRUE, PMA_DBI_QUERY_STORE);
  55.  
  56.         while ($table_copy_row = @PMA_DBI_fetch_assoc($table_copy_rs)) {
  57.             $value_parts = array();
  58.             foreach ($table_copy_row AS $_key => $_val) {
  59.                 if (isset($row_fields[$_key]) && $row_fields[$_key] == 'cc') {
  60.                     $value_parts[] = PMA_sqlAddslashes($_val);
  61.                 }
  62.             }
  63.  
  64.             $new_table_query = 'INSERT IGNORE INTO ' . PMA_backquote($cfgRelation[$pma_table])
  65.                             . ' (' . implode(', ', $select_parts) . ', ' . implode(', ', $new_parts) . ')'
  66.                             . ' VALUES '
  67.                             . ' (\'' . implode('\', \'', $value_parts) . '\', \'' . implode('\', \'', $new_value_parts) . '\')';
  68.  
  69.             $new_table_rs    = PMA_query_as_cu($new_table_query);
  70.             $last_id = PMA_DBI_insert_id();
  71.         } // end while
  72.  
  73.         return $last_id;
  74.     }
  75.  
  76.     return true;
  77. } // end of 'PMA_duplicate_table_info()' function
  78.  
  79.  
  80. /**
  81.  * Copies or renames table
  82.  * FIXME: use RENAME
  83.  *
  84.  * @author          Michal ─îiha┼Ö <michal@cihar.com>
  85.  */
  86. function PMA_table_move_copy($source_db, $source_table, $target_db, $target_table, $what, $move) {
  87.     global $cfgRelation, $dblist, $err_url, $sql_query;
  88.  
  89.     // set export settings we need
  90.     $GLOBALS['use_backquotes'] = 1;
  91.     $GLOBALS['asfile']         = 1;
  92.  
  93.     // Ensure the target is valid
  94.     if (count($dblist) > 0 &&
  95.         (PMA_isInto($source_db, $dblist) == -1 || PMA_isInto($target_db, $dblist) == -1)) {
  96.         exit();
  97.     }
  98.  
  99.     $source = PMA_backquote($source_db) . '.' . PMA_backquote($source_table);
  100.     if (empty($target_db)) $target_db = $source_db;
  101.  
  102.     // Doing a select_db could avoid some problems with replicated databases,
  103.     // when moving table from replicated one to not replicated one
  104.     PMA_DBI_select_db($target_db);
  105.  
  106.     $target = PMA_backquote($target_db) . '.' . PMA_backquote($target_table);
  107.  
  108.     // do not create the table if dataonly
  109.     if ($what != 'dataonly') {
  110.         require_once('./libraries/export/sql.php');
  111.  
  112.         $no_constraints_comments = true;
  113.         $sql_structure = PMA_getTableDef($source_db, $source_table, "\n", $err_url);
  114.         unset($no_constraints_comments);
  115.  
  116.         $parsed_sql =  PMA_SQP_parse($sql_structure);
  117.  
  118.         /* nijel: Find table name in query and replace it */
  119.         $i = 0;
  120.         while ($parsed_sql[$i]['type'] != 'quote_backtick') $i++;
  121.  
  122.         /* no need to PMA_backquote() */
  123.         $parsed_sql[$i]['data'] = $target;
  124.  
  125.         /* Generate query back */
  126.         $sql_structure = PMA_SQP_formatHtml($parsed_sql, 'query_only');
  127.         // If table exists, and 'add drop table' is selected: Drop it!
  128.         $drop_query = '';
  129.         if (isset($GLOBALS['drop_if_exists']) && $GLOBALS['drop_if_exists'] == 'true') {
  130.             $drop_query = 'DROP TABLE IF EXISTS ' . PMA_backquote($target_db) . '.' . PMA_backquote($target_table);
  131.             $result        = PMA_DBI_query($drop_query);
  132.  
  133.             if (isset($sql_query)) {
  134.                 $sql_query .= "\n" . $drop_query . ';';
  135.             } else {
  136.                 $sql_query = $drop_query . ';';
  137.             }
  138.  
  139.             // garvin: If an existing table gets deleted, maintain any entries
  140.             // for the PMA_* tables
  141.             $maintain_relations = TRUE;
  142.         }
  143.  
  144.         $result        = @PMA_DBI_query($sql_structure);
  145.         if (isset($sql_query)) {
  146.             $sql_query .= "\n" . $sql_structure . ';';
  147.         } else {
  148.             $sql_query = $sql_structure . ';';
  149.         }
  150.  
  151.         if (($move || isset($GLOBALS['constraints'])) && isset($GLOBALS['sql_constraints'])) {
  152.             $parsed_sql =  PMA_SQP_parse($GLOBALS['sql_constraints']);
  153.             $i = 0;
  154.  
  155.             // find the first quote_backtick, it must be the source table name
  156.             while ($parsed_sql[$i]['type'] != 'quote_backtick') {
  157.                 $i++;
  158.             }
  159.  
  160.             // replace it by the target table name, no need to PMA_backquote()
  161.             $parsed_sql[$i]['data'] = $target;
  162.  
  163.             // now we must remove all quote_backtick that follow a CONSTRAINT
  164.             // keyword, because a constraint name must be unique in a db
  165.  
  166.             $cnt = $parsed_sql['len'] - 1;
  167.  
  168.             for ($j = $i; $j < $cnt; $j++) {
  169.                 if ($parsed_sql[$j]['type'] == 'alpha_reservedWord'
  170.         && strtoupper($parsed_sql[$j]['data']) == 'CONSTRAINT') {
  171.                     if ($parsed_sql[$j+1]['type'] == 'quote_backtick') {
  172.                         $parsed_sql[$j+1]['data'] = '';
  173.                     }
  174.                 }
  175.             }
  176.  
  177.  
  178.             // Generate query back
  179.             $GLOBALS['sql_constraints'] = PMA_SQP_formatHtml($parsed_sql, 'query_only');
  180.             $result          = PMA_DBI_query($GLOBALS['sql_constraints']);
  181.             if (isset($sql_query)) {
  182.                 $sql_query .= "\n" . $GLOBALS['sql_constraints'];
  183.             } else {
  184.                 $sql_query = $GLOBALS['sql_constraints'];
  185.             }
  186.  
  187.             unset($GLOBALS['sql_constraints']);
  188.         }
  189.  
  190.     } else {
  191.         $sql_query='';
  192.     }
  193.  
  194.     // Copy the data
  195.     //if ($result != FALSE && ($what == 'data' || $what == 'dataonly')) {
  196.     if ($what == 'data' || $what == 'dataonly') {
  197.         $sql_insert_data = 'INSERT INTO ' . $target . ' SELECT * FROM ' . $source;
  198.         PMA_DBI_query($sql_insert_data);
  199.         $sql_query      .= "\n\n" . $sql_insert_data . ';';
  200.     }
  201.  
  202.     require_once('./libraries/relation.lib.php');
  203.     $cfgRelation = PMA_getRelationsParam();
  204.  
  205.     // Drops old table if the user has requested to move it
  206.     if ($move) {
  207.  
  208.         // This could avoid some problems with replicated databases, when
  209.         // moving table from replicated one to not replicated one
  210.         PMA_DBI_select_db($source_db);
  211.  
  212.         $sql_drop_table = 'DROP TABLE ' . $source;
  213.         PMA_DBI_query($sql_drop_table);
  214.  
  215.         // garvin: Move old entries from PMA-DBs to new table
  216.         if ($cfgRelation['commwork']) {
  217.             $remove_query = 'UPDATE ' . PMA_backquote($cfgRelation['column_info'])
  218.                           . ' SET     table_name = \'' . PMA_sqlAddslashes($target_table) . '\', '
  219.                           . '        db_name    = \'' . PMA_sqlAddslashes($target_db) . '\''
  220.                           . ' WHERE db_name  = \'' . PMA_sqlAddslashes($source_db) . '\''
  221.                           . ' AND table_name = \'' . PMA_sqlAddslashes($source_table) . '\'';
  222.             $rmv_rs    = PMA_query_as_cu($remove_query);
  223.             unset($rmv_query);
  224.         }
  225.  
  226.         // garvin: updating bookmarks is not possible since only a single table is moved,
  227.         // and not the whole DB.
  228.         // if ($cfgRelation['bookmarkwork']) {
  229.         //     $remove_query = 'UPDATE ' . PMA_backquote($cfgRelation['bookmark'])
  230.         //                   . ' SET     dbase = \'' . PMA_sqlAddslashes($target_db) . '\''
  231.         //                   . ' WHERE dbase  = \'' . PMA_sqlAddslashes($source_db) . '\'';
  232.         //     $rmv_rs    = PMA_query_as_cu($remove_query);
  233.         //     unset($rmv_query);
  234.         // }
  235.  
  236.         if ($cfgRelation['displaywork']) {
  237.             $table_query = 'UPDATE ' . PMA_backquote($cfgRelation['table_info'])
  238.                             . ' SET     db_name = \'' . PMA_sqlAddslashes($target_db) . '\', '
  239.                             . '         table_name = \'' . PMA_sqlAddslashes($target_table) . '\''
  240.                             . ' WHERE db_name  = \'' . PMA_sqlAddslashes($source_db) . '\''
  241.                             . ' AND table_name = \'' . PMA_sqlAddslashes($source_table) . '\'';
  242.             $tb_rs    = PMA_query_as_cu($table_query);
  243.             unset($table_query);
  244.             unset($tb_rs);
  245.         }
  246.  
  247.         if ($cfgRelation['relwork']) {
  248.             $table_query = 'UPDATE ' . PMA_backquote($cfgRelation['relation'])
  249.                             . ' SET     foreign_table = \'' . PMA_sqlAddslashes($target_table) . '\','
  250.                             . '         foreign_db = \'' . PMA_sqlAddslashes($target_db) . '\''
  251.                             . ' WHERE foreign_db  = \'' . PMA_sqlAddslashes($source_db) . '\''
  252.                             . ' AND foreign_table = \'' . PMA_sqlAddslashes($source_table) . '\'';
  253.             $tb_rs    = PMA_query_as_cu($table_query);
  254.             unset($table_query);
  255.             unset($tb_rs);
  256.  
  257.             $table_query = 'UPDATE ' . PMA_backquote($cfgRelation['relation'])
  258.                             . ' SET     master_table = \'' . PMA_sqlAddslashes($target_table) . '\','
  259.                             . '         master_db = \'' . PMA_sqlAddslashes($target_db) . '\''
  260.                             . ' WHERE master_db  = \'' . PMA_sqlAddslashes($source_db) . '\''
  261.                             . ' AND master_table = \'' . PMA_sqlAddslashes($source_table) . '\'';
  262.             $tb_rs    = PMA_query_as_cu($table_query);
  263.             unset($table_query);
  264.             unset($tb_rs);
  265.         }
  266.  
  267.         // garvin: [TODO] Can't get moving PDFs the right way. The page numbers always
  268.         // get screwed up independently from duplication because the numbers do not
  269.         // seem to be stored on a per-database basis. Would the author of pdf support
  270.         // please have a look at it?
  271.  
  272.         if ($cfgRelation['pdfwork']) {
  273.             $table_query = 'UPDATE ' . PMA_backquote($cfgRelation['table_coords'])
  274.                             . ' SET     table_name = \'' . PMA_sqlAddslashes($target_table) . '\','
  275.                             . '         db_name = \'' . PMA_sqlAddslashes($target_db) . '\''
  276.                             . ' WHERE db_name  = \'' . PMA_sqlAddslashes($source_db) . '\''
  277.                             . ' AND table_name = \'' . PMA_sqlAddslashes($source_table) . '\'';
  278.             $tb_rs    = PMA_query_as_cu($table_query);
  279.             unset($table_query);
  280.             unset($tb_rs);
  281.             /*
  282.             $pdf_query = 'SELECT pdf_page_number '
  283.                        . ' FROM ' . PMA_backquote($cfgRelation['table_coords'])
  284.                        . ' WHERE db_name  = \'' . PMA_sqlAddslashes($target_db) . '\''
  285.                        . ' AND table_name = \'' . PMA_sqlAddslashes($target_table) . '\'';
  286.             $pdf_rs = PMA_query_as_cu($pdf_query);
  287.  
  288.             while ($pdf_copy_row = PMA_DBI_fetch_assoc($pdf_rs)) {
  289.                 $table_query = 'UPDATE ' . PMA_backquote($cfgRelation['pdf_pages'])
  290.                                 . ' SET     db_name = \'' . PMA_sqlAddslashes($target_db) . '\''
  291.                                 . ' WHERE db_name  = \'' . PMA_sqlAddslashes($source_db) . '\''
  292.                                 . ' AND page_nr = \'' . PMA_sqlAddslashes($pdf_copy_row['pdf_page_number']) . '\'';
  293.                 $tb_rs    = PMA_query_as_cu($table_query);
  294.                 unset($table_query);
  295.                 unset($tb_rs);
  296.             }
  297.             */
  298.         }
  299.  
  300.         $sql_query      .= "\n\n" . $sql_drop_table . ';';
  301.     } else {
  302.         // garvin: Create new entries as duplicates from old PMA DBs
  303.         if ($what != 'dataonly' && !isset($maintain_relations)) {
  304.             if ($cfgRelation['commwork']) {
  305.                 // Get all comments and MIME-Types for current table
  306.                 $comments_copy_query = 'SELECT
  307.                                             column_name, ' . PMA_backquote('comment') . ($cfgRelation['mimework'] ? ', mimetype, transformation, transformation_options' : '') . '
  308.                                         FROM ' . PMA_backquote($cfgRelation['column_info']) . '
  309.                                         WHERE
  310.                                             db_name = \'' . PMA_sqlAddslashes($source_db) . '\' AND
  311.                                             table_name = \'' . PMA_sqlAddslashes($source_table) . '\'';
  312.                 $comments_copy_rs    = PMA_query_as_cu($comments_copy_query);
  313.  
  314.                 // Write every comment as new copied entry. [MIME]
  315.                 while ($comments_copy_row = PMA_DBI_fetch_assoc($comments_copy_rs)) {
  316.                     $new_comment_query = 'REPLACE INTO ' . PMA_backquote($cfgRelation['column_info'])
  317.                                 . ' (db_name, table_name, column_name, ' . PMA_backquote('comment') . ($cfgRelation['mimework'] ? ', mimetype, transformation, transformation_options' : '') . ') '
  318.                                 . ' VALUES('
  319.                                 . '\'' . PMA_sqlAddslashes($target_db) . '\','
  320.                                 . '\'' . PMA_sqlAddslashes($target_table) . '\','
  321.                                 . '\'' . PMA_sqlAddslashes($comments_copy_row['column_name']) . '\''
  322.                                 . ($cfgRelation['mimework'] ? ',\'' . PMA_sqlAddslashes($comments_copy_row['comment']) . '\','
  323.                                         . '\'' . PMA_sqlAddslashes($comments_copy_row['mimetype']) . '\','
  324.                                         . '\'' . PMA_sqlAddslashes($comments_copy_row['transformation']) . '\','
  325.                                         . '\'' . PMA_sqlAddslashes($comments_copy_row['transformation_options']) . '\'' : '')
  326.                                 . ')';
  327.                     $new_comment_rs    = PMA_query_as_cu($new_comment_query);
  328.                 } // end while
  329.             }
  330.  
  331.             if ($source_db != $target_db) {
  332.                 $get_fields = array('user','label','query');
  333.                 $where_fields = array('dbase' => $source_db);
  334.                 $new_fields = array('dbase' => $target_db);
  335.                 PMA_duplicate_table_info('bookmarkwork', 'bookmark', $get_fields, $where_fields, $new_fields);
  336.             }
  337.  
  338.             $get_fields = array('display_field');
  339.             $where_fields = array('db_name' => $source_db, 'table_name' => $source_table);
  340.             $new_fields = array('db_name' => $target_db, 'table_name' => $target_table);
  341.             PMA_duplicate_table_info('displaywork', 'table_info', $get_fields, $where_fields, $new_fields);
  342.  
  343.             $get_fields = array('master_field', 'foreign_db', 'foreign_table', 'foreign_field');
  344.             $where_fields = array('master_db' => $source_db, 'master_table' => $source_table);
  345.             $new_fields = array('master_db' => $target_db, 'master_table' => $target_table);
  346.             PMA_duplicate_table_info('relwork', 'relation', $get_fields, $where_fields, $new_fields);
  347.  
  348.             $get_fields = array('foreign_field', 'master_db', 'master_table', 'master_field');
  349.             $where_fields = array('foreign_db' => $source_db, 'foreign_table' => $source_table);
  350.             $new_fields = array('foreign_db' => $target_db, 'foreign_table' => $target_table);
  351.             PMA_duplicate_table_info('relwork', 'relation', $get_fields, $where_fields, $new_fields);
  352.  
  353.             // garvin: [TODO] Can't get duplicating PDFs the right way. The page numbers always
  354.             // get screwed up independently from duplication because the numbers do not
  355.             // seem to be stored on a per-database basis. Would the author of pdf support
  356.             // please have a look at it?
  357.             /*
  358.             $get_fields = array('page_descr');
  359.             $where_fields = array('db_name' => $source_db);
  360.             $new_fields = array('db_name' => $target_db);
  361.             $last_id = PMA_duplicate_table_info('pdfwork', 'pdf_pages', $get_fields, $where_fields, $new_fields);
  362.  
  363.             if (isset($last_id) && $last_id >= 0) {
  364.                 $get_fields = array('x', 'y');
  365.                 $where_fields = array('db_name' => $source_db, 'table_name' => $source_table);
  366.                 $new_fields = array('db_name' => $target_db, 'table_name' => $target_table, 'pdf_page_number' => $last_id);
  367.                 PMA_duplicate_table_info('pdfwork', 'table_coords', $get_fields, $where_fields, $new_fields);
  368.             }
  369.             */
  370.         }
  371.     }
  372.  
  373. }
  374. ?>
  375.